# C/C++ GPIO开发 ***Copyright © Quectel Wireless Solutions Co., Ltd. 2026. All rights reserved.*** --- 本文档说明 Quectel Pi M2 上使用 C/C++ 访问 GPIO 的推荐方式。当前开发板已验证可使用 libgpiod v1.6.3,默认推荐 libgpiod 路径。 # 环境准备 ```bash sudo apt update sudo apt install -y build-essential gpiod libgpiod-dev gpiodetect --version gpiodetect ``` | **项目** | **说明** | | --- | --- | | 推荐库 | libgpiod | | 编译参数 | `-lgpiod` | | 主控制器 | 当前验证为 `/dev/gpiochip0` | # 读取示例 ```c #include #include int main(void) { struct gpiod_chip *chip; struct gpiod_line_settings *settings; struct gpiod_line_config *line_cfg; struct gpiod_request_config *req_cfg; struct gpiod_line_request *request; unsigned int offset = 36; int value; chip = gpiod_chip_open("/dev/gpiochip0"); if (!chip) { perror("gpiod_chip_open"); return 1; } settings = gpiod_line_settings_new(); gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_INPUT); line_cfg = gpiod_line_config_new(); gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings); req_cfg = gpiod_request_config_new(); gpiod_request_config_set_consumer(req_cfg, "m1-gpio-input"); request = gpiod_chip_request_lines(chip, req_cfg, line_cfg); if (!request) { perror("gpiod_chip_request_lines"); return 1; } value = gpiod_line_request_get_value(request, offset); printf("value=%d\n", value); gpiod_line_request_release(request); gpiod_line_config_free(line_cfg); gpiod_line_settings_free(settings); gpiod_request_config_free(req_cfg); gpiod_chip_close(chip); return 0; } ``` ```bash gcc -Wall -o gpio_input gpio_input.c -lgpiod sudo ./gpio_input ``` # 输出示例 ```c #include #include #include int main(void) { struct gpiod_chip *chip; struct gpiod_line_settings *settings; struct gpiod_line_config *line_cfg; struct gpiod_request_config *req_cfg; struct gpiod_line_request *request; unsigned int offset = 36; chip = gpiod_chip_open("/dev/gpiochip0"); if (!chip) { perror("gpiod_chip_open"); return 1; } settings = gpiod_line_settings_new(); gpiod_line_settings_set_direction(settings, GPIOD_LINE_DIRECTION_OUTPUT); gpiod_line_settings_set_output_value(settings, GPIOD_LINE_VALUE_ACTIVE); line_cfg = gpiod_line_config_new(); gpiod_line_config_add_line_settings(line_cfg, &offset, 1, settings); req_cfg = gpiod_request_config_new(); gpiod_request_config_set_consumer(req_cfg, "m1-gpio-output"); request = gpiod_chip_request_lines(chip, req_cfg, line_cfg); if (!request) { perror("gpiod_chip_request_lines"); return 1; } sleep(1); gpiod_line_request_set_value(request, offset, GPIOD_LINE_VALUE_INACTIVE); gpiod_line_request_release(request); gpiod_line_config_free(line_cfg); gpiod_line_settings_free(settings); gpiod_request_config_free(req_cfg); gpiod_chip_close(chip); return 0; } ``` ```bash gcc -Wall -o gpio_output gpio_output.c -lgpiod sudo ./gpio_output ``` # 注意事项 - 实际 line offset 需结合开发板引脚定义确认。 - 运行失败时先用 `gpioinfo /dev/gpiochip0` 检查线路是否被占用。 - 若编译提示找不到 `gpiod.h`,确认已安装 `libgpiod-dev`。